import OpenAI from "openai";
import * as fs from "fs";
import { TOKEN } from "./token.js";
import os from "os";
import path from "path";

const client = new OpenAI({
  apiKey: TOKEN,
  baseURL: "https://api.moonshot.cn/v1",
});

/**
 *  从返回的字符串中抽取jsx
 * @param {string} rawStr
 * @param {boolean} isTs
 * @return {string}
 */
const getJsx = (rawStr, isTs = false) => {
  const tsxBlockRegex = /```jsx([\s\S]*?)```/;
  const match = rawStr.match(tsxBlockRegex);

  // 如果匹配成功，返回第一个匹配的TSX代码块
  if (match && match[1]) {
    return match[1].trim();
  }

  // 如果没有匹配到，返回''
  return "";
};

/**
 *  从返回的字符串中抽取css
 * @param {string} rawStr
 * @param {boolean} isLess
 * @return {string}
 */
const getCss = (rawStr, isLess = false) => {
  const tsxBlockRegex = /```css([\s\S]*?)```/;
  const match = rawStr.match(tsxBlockRegex);

  // 如果匹配成功，返回第一个匹配的TSX代码块
  if (match && match[1]) {
    return match[1].trim();
  }

  // 如果没有匹配到，返回undefined或提示信息
  return "";
};

/**
 * getCssByIndex从返回的字符串中抽取css，包括index
 * @param {string} rawStr 原始字符串
 * @param {number} index 需要返回的CSS代码块的索引
 * @param {boolean} isLess 是否是LESS语法
 * @return {string} 返回的CSS字符串
 */
const getCssByIndex = (rawStr, index = 0, isLess = false) => {
  const cssBlockRegex = /```css([\s\S]*?)```/g; // 使用全局匹配模式
  const matches = rawStr.match(cssBlockRegex); // 匹配所有CSS代码块

  if (matches && matches.length > 0) {
    // 检查索引是否在匹配结果范围内
    if (index < matches.length) {
      return matches[index].trim();
    } else {
      // 如果索引超出范围，返回最后一个匹配的CSS字符串
      return matches[matches.length - 1].trim();
    }
  }

  // 如果没有匹配到，返回空字符串
  return "";
};

/**
 * 把读取的数据写入
 * @param {string} jsxStr
 * @param {string} cssStr
 */
function writeToTmpFile(jsxStr, cssStr) {
  // 获取系统临时文件夹路径
  const tmpDir = os.tmpdir();

  // 获取当前时间戳
  const time = Date.now();

  // 定义文件名，格式为：${time}.txt
  // const fileName = `${time}.txt`;
  fs.mkdirSync(path.join(tmpDir, JSON.stringify(time)));
  // 构建文件的完整路径
  const JsFilePath = path.join(tmpDir, JSON.stringify(time), "index.jsx");
  fs.writeFile(JsFilePath, jsxStr, (err) => {
    if (err) {
      console.error("Error writing file:", err);
    } else {
      console.log(`File written successfully: ${JsFilePath}`);
    }
  });

  // 构建文件的完整路径
  const CssFilePath = path.join(tmpDir, JSON.stringify(time), "index.css");
  fs.writeFile(CssFilePath, cssStr, (err) => {
    if (err) {
      console.error("Error writing file:", err);
    } else {
      console.log(`File written successfully: ${CssFilePath}`);
    }
  });
}

/**
 * https://platform.moonshot.cn/docs/api/files
 * 上传一个文件，写下代码
 * @param {string} filePath
 * @return {Promise<void>}
 */
async function uploadFile2Code(filePath) {
  let file_object = await client.files.create({
    file: fs.createReadStream(filePath),
    purpose: "file-extract",
  });
  // 获取结果
  // file_content = client.files.retrieve_content(file_id=file_object.id)
  // 注意，之前 retrieve_content api 在最新版本标记了 warning, 可以用下面这行代替
  // 如果是旧版本，可以用 retrieve_content
  let file_content = await (await client.files.content(file_object.id)).text();

  // 把它放进请求中
  let messages = [
    // {
    //   role: "system",
    //   content:
    //     "你是 Kimi，由 Moonshot AI 提供的人工智能助手，你更擅长中文和英文的对话。你会为用户提供安全，有帮助，准确的回答。同时，你会拒绝一切涉及恐怖主义，种族歧视，黄色暴力等问题的回答。Moonshot AI 为专有名词，不可翻译成其他语言。",
    // },
    {
      role: "system",
      content: file_content,
    },
    {
      role: "user",
      content:
        "请用react和css样式来画出这个图片，你只需要返回给我react的jsx代码以及css两个代码块即可。",
    },
  ];

  const completion = await client.chat.completions.create({
    model: "moonshot-v1-8k",
    messages: messages,
    temperature: 0.3,
  });
  writeToTmpFile(
    getJsx(completion.choices[0].message.content),
    getCss(completion.choices[0].message.content),
  );
}

/**
 * https://platform.moonshot.cn/docs/api/files
 * 上传一个文件，写下代码，并且支持多轮对话
 * TODO: 支持多轮对话
 * @param {string} filePath
 * @param {string[]} botMessageList
 * @param {string[]} userMessageList
 * @return {Promise<void>}
 */
async function uploadFile2CodeMultiChat(
  filePath,
  botMessageList,
  userMessageList,
) {
  let file_object = await client.files.create({
    file: fs.createReadStream(filePath),
    purpose: "file-extract",
  });
  let file_content = await (await client.files.content(file_object.id)).text();
  let messages = [
    {
      role: "system",
      content: file_content,
    },
    {
      role: "user",
      content:
        "请用react和css样式来画出这个图片，你只需要返回给我react的jsx代码以及css两个代码块即可。",
    },
  ];
  let chatTimes = Math.min(botMessageList.length, userMessageList.length);
  for (let nowIndex = 0; nowIndex < chatTimes; nowIndex++) {
    let nowBotMessage = botMessageList[nowIndex];
    messages.push({
      role: "system",
      content: nowBotMessage,
    });
    let nowUserMessage = userMessageList[nowIndex];
    messages.push({
      role: "user",
      content: nowUserMessage,
    });
  }
  const completion = await client.chat.completions.create({
    model: "moonshot-v1-8k",
    messages: messages,
    temperature: 0.3,
  });
  writeToTmpFile(
    getJsx(completion.choices[0].message.content),
    getCss(completion.choices[0].message.content),
  );
}

export {
  uploadFile2Code,
  getCss,
  getJsx,
  writeToTmpFile,
  getCssByIndex,
  uploadFile2CodeMultiChat,
};
